package br.com.financeiro.controllers;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Component;

import br.com.financeiro.dao.ContaDao;
import br.com.financeiro.dao.GenericDao;
import br.com.financeiro.dominio.CategoriaConta;
import br.com.financeiro.dominio.Conta;
import br.com.financeiro.dominio.SituacaoConta;
import br.com.financeiro.services.AbstractService;

@Component
@Scope("session")
public class ContasMBean extends AbstractMBean<Conta>{
	
	private int mes;
	
	private int ano;
	
	private List<Conta> contas;
	
	@Autowired
	private GenericDao dao;
	
	@Autowired
	private ContaDao contaDao;
	
	public ContasMBean(){
		obj = new Conta();
		obj.inicializa();
		contas = new ArrayList<Conta>();
		setListagem(contas);
	}

	@Override
	protected String getDir() {
		return "/pages/contas";
	}
	
	@Autowired
	public void setService(AbstractService<Conta> service){
		super.setService(service);
	}
	
	@Override
	public String listar(){
		mes = getMesAtual();
		ano = getAnoAtual();
		return consultar();
	}
	
	@Override
	@Secured("ROLE_ADMIN")
	public String novo(){
		obj = new Conta();
		obj.inicializa();
		obj.setDataPagamento(new Date());
		obj.setDataVencimento(new Date());
		return super.novo();
	}
	
	@Override
	public String salvar(){
		service.salvarOuAtualizar(obj);
		addMensagemSucesso("Dados salvos com sucesso.");
		return consultar();
	}
	
	@Override
	public String atualizar(){
		service.salvarOuAtualizar(obj);
		addMensagemSucesso("Dados atualizados com sucesso.");
		return consultar();
	}
	
	@Override
	public String remover(){
		obj = (Conta)listagem.getRowData();
		service.remover(obj);
		addMensagemSucesso("Registro removido com sucesso.");
		return consultar();
	}
	
	public String consultar(){
		contas = contaDao.findByMesAno(mes, ano);
		listagem = null;
		setListagem(contas);
		return getDir() + "/list";
	}
	
	public double getValorTotal(){
		double total = 0;
		if(!contas.isEmpty()){
			for(Conta c : contas){
				if(c.getTipo().isPagamento())
					total -= c.getValor();
				else if(c.getTipo().isRecebimento())
					total += c.getValor();
			}
		}
		return total;
	}
	
	public List<SelectItem> getCategorias() throws Exception{
		return toSelectItens(dao.findByField(CategoriaConta.class, "grupo.id", obj.getCategoria().getGrupo().getId()), "id", "descricao");
	}
	
	public List<SelectItem> getSituacoes() throws Exception{
		return toSelectItens(dao.listar(SituacaoConta.class, "descricao"), "id", "descricao");
	}
	
	@Override
	public DataModel<Conta> getListagem(){
		return listagem;
	}
	
	public static int getAnoAtual(){
		return Calendar.getInstance().get(Calendar.YEAR);
	}
	
	public static int getMesAtual(){
		return Calendar.getInstance().get(Calendar.MONTH)+1;
	}

	public List<Conta> getContas() {
		return contas;
	}

	public void setContas(List<Conta> contas) {
		this.contas = contas;
	}

	public int getMes() {
		return mes;
	}

	public void setMes(int mes) {
		this.mes = mes;
	}

	public int getAno() {
		return ano;
	}

	public void setAno(int ano) {
		this.ano = ano;
	}

}